﻿#define _CRT_SECURE_NO_WARNINGS
//85.
//两个数对(a, b) 和(c, d) 之间的 乘积差 定义为(a* b) - (c * d) 。
//
//例如，(5, 6) 和(2, 7) 之间的乘积差是(5 * 6) - (2 * 7) = 16 。
//给你一个整数数组 nums ，选出四个 不同的 下标 w、x、y 和 z ，
//使数对(nums[w], nums[x]) 和(nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
//
//返回以这种方式取得的乘积差中的 最大值 。
// 因为求两数之间的最⼤值或者最⼩值的次数较多，因此定义函数返回两数最⼤值和最⼩值
int Max(int x, int y) { return x > y ? x : y; }
int Min(int x, int y) { return x > y ? y : x; }
int maxProductDifference(int* nums, int numsSize) {
    int min1 = Min(nums[0], nums[1]); // 最⼩
    int min2 = Max(nums[0], nums[1]); // 次⼩
    int max1 = Max(nums[0], nums[1]); // 最⼤
    int max2 = Min(nums[0], nums[1]); // 次⼤
    int i = 0;
    for (i = 2; i < numsSize; i++) {
        // 将当前元素与最⼩值和次⼩值进⾏⽐较，更新最⼩值和次⼩值
        if (nums[i] < min1) {
            min2 = min1;
            min1 = nums[i];
        }
        else if (nums[i] < min2) {
            min2 = nums[i];
        }
        // 将当前元素与最⼤值和次⼤值进⾏⽐较，更新最⼤值和次⼤值
        if (nums[i] > max1) {
            max2 = max1;
            max1 = nums[i];
        }
        else if (nums[i] > max2) {
            max2 = nums[i];
        }
    }

    // 返回最⼤值与次⼤值的乘积减去最⼩值与次⼩值的差
    return max1 * max2 - min1 * min2;
}